package com.cskaoyan.javase.oop1._14import._0one;

// import com.cskaoyan.javase.oop1._14import._1another.Teacher;

/**
 * 测试类
 * 在Java中，同包中是绝对不存在同名类的。那么编译器在查找某个类时，会优先从同包中去查找，如果同包能够直接找到，就能够正确编译。反之，找不到，那就没有这个类，编译就会报错。
 *
 * 但是不同包下，完全可能出现同名类。这时，如果编译器去找，那么这个类就不一定是唯一的了。那这时候，就需要程序员告诉编译器，究竟使用哪个不同包下的class，这就是导包。
 *
 * 导包的语法使用import关键字
 * 语法： import + 一个类的全限定类名（这样才能唯一确定一个类）
 * 导包语法的位置： 应该写在package下面，正是的class代码之前。一般建议紧贴package声明写导包语句。
 *
 * 因为idea是比较高级的智能工具，多数情况下，导包可以自动完成。（但是如果有多选时，还是需要选择，不要导错包了，不要选错了。）
 *
 * 注意事项：
 * 1. 像String、System、Math等常用类很明显不是同包下的类，但我们并没有进行导包操作
 *    - 这是因为在Java当中，java.lang包是Java的核心类包，具有隐式的导包
 *    - **注意java.lang包下的所有类是隐式的导入了每个Java类，而不是没有导入！**
 *
 * 2. 实际上完全可以不导包去使用不同包下类，这时要明确指出这个类的所属包，也就是要使用全限定类名。
 *    但是一般情况下，全限定类名都很长，导包仍然是更好的手段。
 *
 * 3. 但是导包总不是都好用，在极少的情况下：比如在Demo类中如果想要同时访问两个包onepackage、anotherpackage下的两个Student类，就需要一个Student类使用全限定类名，另一个导包或者就近原则直接使用。（当然条件允许的情况下，干脆把其中一个Studnet改名会更好。）
 *
 * 智能导入：导包时，可以在类名的位置用"*"替代，表示通配，编译器会自动根据需要导入该包下的所有可能需要使用的类。
 *
 * @since 11:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */

public class Demo {
    public static void main(String[] args) {
        // 场景：我想在一个类中，同时使用两个包下的同名类，那怎么办？
        /*
            如果有这种场景,如果代码是能够修改的,尽量还是去修改类名.
         */
        /*// 就近原则访问同包
        Student s = new Student();
        s.test();
        // 直接用全限定类名创建对象
        com.cskaoyan.javase.oop1._14import._1another.Student s2 = new com.cskaoyan.javase.oop1._14import._1another.Student();
        s2.test();*/

        // Scanner sc = new Scanner(System.in);
        // Arrays.toString()


        // 如果智能导入不导包，编译会报错
        // Teacher t = new Teacher();

        // 这时我想使用不同包下的Student类，智能导入能生效吗？
        // 不能生效，因为同包下已经有同名类了，不导包也不会报错，这就不叫必须导包。
        // Student s = new Student();

        com.cskaoyan.javase.oop1._14import._1another.Teacher t = new com.cskaoyan.javase.oop1._14import._1another.Teacher();
        t.test();
    }
}

// 'Teacher' is already defined in this compilation unit
class Teacher {
    public void test() {
        System.out.println("我是one包下的老师类");
    }
}
